package com.sann.condition;

import com.sann.entity.RainBow;
import org.springframework.beans.factory.support.BeanDefinitionRegistry;
import org.springframework.beans.factory.support.RootBeanDefinition;
import org.springframework.context.annotation.ImportBeanDefinitionRegistrar;
import org.springframework.core.type.AnnotationMetadata;

/**
 * 测试注入第三方 Bean的4种方式之方式三：通过实现 Spring 的 ImportBeanDefinitionRegistrar，
 * 这种方式可以通过注解@Import里面的 value属性上注释可以看到有介绍.
 */
public class MyImportBeanDefinitionRegistrar implements ImportBeanDefinitionRegistrar {

    /**
     * 如果系统中存在com.sann.entity.Red、com.sann.entity.Blue这两种类型的Bean，就再注册一个RainBow
     *
     * @param importingClassMetadata AnnotationMetadata类型，当前类的所有注解信息
     * @param registry BeanDefinitionRegistry类型，BeanDefinition的注册类，
     *                 把我们需要的Bean通过Registry注册到容器中，通过调用：
     *                 BeanDefinitionRegistry.registerBeanDefinition()手动注入
     */
    @Override
    public void registerBeanDefinitions(AnnotationMetadata importingClassMetadata,
                                        BeanDefinitionRegistry registry) {
        boolean condition1 = registry.containsBeanDefinition("com.sann.entity.Red");
        boolean condition2 = registry.containsBeanDefinition("com.sann.entity.Blue");
        if(condition1 && condition2){
            // 指定Bean定义信息：包括Bean的类型，Bean的作用域范围
            RootBeanDefinition beanDefinition = new RootBeanDefinition(RainBow.class);
            // 注册一个Bean，指定Bean的名字
            registry.registerBeanDefinition("rainBow", beanDefinition);
        }
    }
}
